package com.fernandocejas.frodo.aspect;
import com.fernandocejas.frodo.annotation.RxLogObservable;
import com.fernandocejas.frodo.internal.observable.FrodoObservable;
import com.fernandocejas.frodo.internal.observable.LoggableObservableFactory;
import com.fernandocejas.frodo.internal.MessageManager;
import com.fernandocejas.frodo.internal.observable.ObservableInfo;
import com.fernandocejas.frodo.joinpoint.FrodoProceedingJoinPoint;
import java.lang.annotation.Annotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import rx.Observable;
@Aspect
public class LogObservable {
private static final String METHOD =
"execution(@com.fernandocejas.frodo.annotation.RxLogObservable * *(..)) && if()";
@Pointcut(METHOD)
public static boolean methodAnnotatedWithRxLogObservable(ProceedingJoinPoint joinPoint) {
final FrodoProceedingJoinPoint frodoJoinPoint = new FrodoProceedingJoinPoint(joinPoint);
final Annotation annotation = frodoJoinPoint.getAnnotation(RxLogObservable.class);
return ((MethodSignature) joinPoint.getSignature()).getReturnType() == Observable.class
&& ((RxLogObservable)annotation).value() != RxLogObservable.Scope.NOTHING;
}
@Around("methodAnnotatedWithRxLogObservable(joinPoint)")
public Object weaveAroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
final FrodoProceedingJoinPoint proceedingJoinPoint = new FrodoProceedingJoinPoint(joinPoint);
final MessageManager messageManager = new MessageManager();
final LoggableObservableFactory observableFactory =
new LoggableObservableFactory(proceedingJoinPoint, messageManager,
new ObservableInfo(proceedingJoinPoint));
return new FrodoObservable(proceedingJoinPoint, messageManager,
observableFactory).getObservable();
}
}